package com.volunteer.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.volunteer.entity.Activity;
import com.volunteer.model.vo.HomeDataVO;
import com.volunteer.model.vo.ActivityDetailVO;
import com.volunteer.model.vo.ActivityListVO;

import java.util.concurrent.CompletableFuture;

import java.util.List;

/**
 * 活动服务接口
 */
public interface ActivityService extends IService<Activity> {

    /**
     * 获取活动列表
     *
     * @param status        活动状态
     * @param isRecommended 是否推荐
     * @param page          页码
     * @param size          每页数量
     * @return 活动列表
     */
    CompletableFuture<List<ActivityListVO>> getActivityList(Integer status, Boolean isRecommended, Integer page, Integer size);

    /**
     * 获取活动详情
     *
     * @param activityId 活动ID
     * @param userId     用户ID
     * @return 活动详情
     */
    ActivityDetailVO getActivityDetail(Long activityId, Long userId);

    /**
     * 创建活动
     *
     * @param activity 活动信息
     * @return 活动ID
     */
    boolean createActivity(Activity activity);

    /**
     * 更新活动
     *
     * @param activity 活动信息
     * @return 更新结果
     */
    boolean updateActivity(Activity activity);

    /**
     * 删除活动
     *
     * @param activityId 活动ID
     * @return 删除结果
     */
    CompletableFuture<Boolean> deleteActivity(Long activityId);

    /**
     * 推荐/取消推荐活动
     *
     * @param activityId    活动ID
     * @param isRecommended 是否推荐
     * @return 操作结果
     */
    CompletableFuture<Boolean> recommendActivity(Long activityId, Boolean isRecommended);

    /**
     * 更新活动状态
     *
     * @param activityId 活动ID
     * @param status     状态
     * @return 更新结果
     */
    CompletableFuture<Boolean> updateActivityStatus(Long activityId, Integer status);

    /**
     * 获取用户创建的活动
     *
     * @param userId 用户ID
     * @param page   页码
     * @param size   每页数量
     * @return 活动列表
     */
    CompletableFuture<List<ActivityListVO>> getCreatedActivities(Long userId, Integer page, Integer size);

    /**
     * 查询热门活动列表
     *
     * @param limit 数量限制
     * @return 热门活动列表
     */
    CompletableFuture<List<ActivityListVO>> getHotActivities(Integer limit);

    /**
     * 获取活动总数
     *
     * @return 活动总数
     */
    CompletableFuture<Integer> getActivityCount();

    /**
     * 获取用户参与的活动列表
     *
     * @param userId 用户ID
     * @param page   页码
     * @param size   每页数量
     * @return 活动列表
     */
    CompletableFuture<List<ActivityListVO>> getJoinedActivities(Long userId, Integer page, Integer size);

    /**
     * 取消活动
     *
     * @param activityId 活动ID
     * @param userId     操作用户ID
     * @return 是否成功
     */
    boolean cancelActivity(Long activityId, Long userId);

    /**
     * 分页查询公开活动列表
     *
     * @param page     分页参数
     * @param activity 查询条件
     * @return 活动列表
     */
    Page<Activity> pagePublicActivities(Page<Activity> page, Activity activity);

    /**
     * 分页查询用户创建的活动列表
     *
     * @param page     分页参数
     * @param userId   用户ID
     * @param activity 查询条件
     * @return 活动列表
     */
    Page<Activity> pageUserCreateActivities(Page<Activity> page, Long userId, Activity activity);

    /**
     * 分页查询用户报名的活动列表
     *
     * @param page     分页参数
     * @param userId   用户ID
     * @param activity 查询条件
     * @return 活动列表
     */
    Page<Activity> pageUserJoinActivities(Page<Activity> page, Long userId, Activity activity);

    /**
     * 分页查询用户收藏的活动列表
     *
     * @param page     分页参数
     * @param userId   用户ID
     * @param activity 查询条件
     * @return 活动列表
     */
    Page<Activity> pageUserCollectActivities(Page<Activity> page, Long userId, Activity activity);

    /**
     * 设置活动是否推荐
     *
     * @param activityId    活动ID
     * @param isRecommended 是否推荐（0-否 1-是）
     * @return 是否成功
     */
    boolean setActivityRecommend(Long activityId, Integer isRecommended);

    /**
     * 设置活动是否展示
     *
     * @param activityId 活动ID
     * @param isDisplay  是否展示（0-否 1-是）
     * @return 是否成功
     */
    boolean setActivityDisplay(Long activityId, Integer isDisplay);

    /**
     * 获取首页活动数据
     *
     * @return 首页活动数据
     */
    List<HomeDataVO.ActivityVO> getHotActivities();



//    ===============================================================




}
